package com.ruirui.webflux;

import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.reactive.DispatcherHandler;
import reactor.core.publisher.BaseSubscriber;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.netty.http.server.HttpServer;

import java.io.IOException;
import java.time.Duration;

public class FluxMain {
    public static void main(String[] args) throws IOException {
        HttpHandler httpHandler = (ServerHttpRequest request,
                ServerHttpResponse response) -> {
            System.out.println(request.getURI());
            DataBufferFactory dataBufferFactory = response.bufferFactory();
            //参数 数据的缓冲区
            DataBuffer wrap = dataBufferFactory.wrap("hello world ".getBytes());
            //buffer发布者
            Flux<DataBuffer> dataBufferFlux = Flux.just(wrap).delayElements(Duration.ofMillis(1000));
            return response.writeWith(dataBufferFlux);
        };


        /**
         * 根据代码分析，这个应用程序使用的是 **Reactor Netty** 作为底层HTTP服务器。
         *
         * 具体来说：
         * 1. 代码中使用了 `reactor.netty.http.server.HttpServer` 类来创建和配置服务器
         * 2. 通过 `ReactorHttpHandlerAdapter` 将Spring的 `HttpHandler` 适配到Reactor Netty
         * 3. Reactor Netty是Spring WebFlux的默认响应式服务器，它基于Netty构建，提供了高性能的异步非阻塞HTTP服务
         *
         * 所以底层服务器是Reactor Netty，它是一个基于Netty的响应式HTTP服务器实现。
         */
        ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
        /**
         * 创建一个HttpServer 对象，并绑定端口
         */

        HttpServer.create().host("localhost").port(8080).
                handle(adapter).bindNow();
        /**
         * 🌐 程序行为总结：
         * 启动一个 HTTP 服务器在 http://localhost:8080/
         *
         * 当你访问这个地址时，会打印请求 URI，并返回 hello world 字符串
         *
         * 使用的是 纯 WebFlux + Reactor Netty API，没有使用 Spring Boot
         *
         * 🧠 知识点扩展：
         * HttpHandler：WebFlux 的核心接口，类似于 Servlet 的 HttpServlet，用来处理请求和响应。
         *
         * ReactorHttpHandlerAdapter：用于将 WebFlux 的 HttpHandler 适配到 Reactor Netty。
         *
         * HttpServer：Reactor Netty 提供的 HTTP 服务器类，支持响应式处理。
         *
         * Mono：Reactor 中表示 0~1 个元素的异步流。
         */
        System.in.read();
    }
}
